const http = require('http');
// url模块
const url = require('url');
// fs模块 异步操作
const fs = require("fs")

// 常见的mimes类型 详细见 https://www.iana.org/assignments/media-types/media-types.xhtml
const mimes = {
  "html": "text/html",
  "css": "text/css",
  "json": "application/json",
}
// 内置模块开启服务
const server = http.createServer(function (req, res) {
  if (req.method !== "GET") {
    res.statusCode = 405
    res.end('<h1>请求方式不对</h1>')
  }
  // 中文会乱码 设置请求头 有顺序问题 必须放在发送之前
  // res.setHeader('Content-Type', 'text/html; charset=utf-8')
  // 自定义响应头
  // res.setHeader("myHeader","test")

  // // 定义多个同名响应头时
  // res.setHeader("myHeader",["a","b","c"])
  // res.writeHead(200)
  let params = url.parse(req.url)
  // console.log(JSON.stringify(params)) 
  // res.end(JSON.stringify(params))
  // 用来发送响应 只能使用一个
  // res.end("你好!")+

  // 发送HTML文件时 同步获取
  // let html = fs.readFileSync("index14.html", "utf-8", (err, data) => {
  //   if (err) {
  //     console.log(err);
  //     return
  //   }
  // })
  // res.end(html)
  // 异步读取
  // fs.readFile("./index14.html",(err,data) => {
  //   if(err){
  //     res.statusCode = 500
  //     res.end("文件读取失败")
  //     return
  //   }
  //   res.end(data)
  // })

  // 搭建静态资源服务
  let { pathname } = new URL(req.url, "http://localhost")
  let filePath = __dirname + pathname
  fs.readFile(filePath, (err, data) => {
    if (err) {
      // 完善错误处理
      switch (err.code) {
        case 'ENOENT':
          res.statusCode = 404
          res.end('<h1>找不到资源</h1>')
          return
        case 'EPERM':
          res.statusCode = 403
          res.end('<h1>不允许访问</h1>')
          return

        default:
          res.statusCode = 500
          res.end("文件读取失败")
          break;
      }
    }
    // 获取文件后缀名 来设置响应头的 mime类型

    let ext = path.extname(filePath).slice(1)
    let type = mimes[ext]
    if (type) {
      if (ext === "html") {
        // 加这个的原因是 防止html的meta标签设置的不是utf-8 出现乱码问题 响应头的优先级高于Meta标签的
        res.setHeader('Content-Type', type + ';charset=utf-8')
      } else {
        res.setHeader('Content-Type', type)
      }
    } else {
      res.setHeader('Content-Type', "application/octet-stream")
    }
    res.end(data)
  })
}).listen(1001)

// express框架
const express = require('express')
const app = express()
const res_data = [
  { id: 1, name: "xixi", age: 18 },
  { id: 2, name: "hehe", age: 19 },
  { id: 3, name: "haha", age: 20 },
]

// 中间件
// 全局中间件
function recordLog(req, res, next) {
  let {ip,url} = req
  console.log(ip);
  fs.appendFileSync("./access.log",`${ip}::${url}\n`)
  next()
}
app.use(recordLog)
// 图片防盗链 中间件
app.use((req, res, next) => {
  let referer = req.get('referer')
  if(referer){
    let url = new URL(referer)
    let hostname = url.hostname
    if(hostname != "127.0.0.1"){

    }
  }
  next()
})

app.get("/login", (req, res) => {
  let id = url.parse(req.url).query.split("=")[1]
  let data = res_data.find(v => v.id == id)
  let html = `<!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Document</title>
      </head>
      <body>
          <div class="box">${data?.name}</div>
          <div class="box">${data?.age}</div>
      </body>
      </html>`

  // 模板引擎
  let weather = "今天天气真好！"
  let htmls = fs.readFileSync("./index14.html").toString()
  let ejs = require("ejs")
  let result = ejs.render(htmls,{weather:weather})
  if (data) {
    // res.status(200).send(html)
    res.status(200).send(result)

    // 响应
    // 跳转响应
    // res.redirect("http://www.baidu.com")

    // 下载响应
    // res.download(localFilePath)

    // 响应JSON
    // res.json({"id": id, "name": data.name, "age": data.age})

    // res.sendFile(__dirname + '/test.html')
  } else {
    res.status(404).send("暂无数据")
  }
})
app.get("/home", (req, res) => {

})
app.listen(1002, () => {
  console.log("1002服务已开启");
})

// ws
// const QS = require("qs")
const path = require('path')
let token = ""
let fileRequestUrl = ""

// 本地保存路径  __dirname 是一个全局变量，它包含了执行当前脚本所在的目录的绝对路径。这个变量对于确定相对于脚本文件的文件路径特别有用
const localFilePath = path.join(__dirname, 'image.jpg');

// 获取绝对路径
// console.log(path.resolve());

// console.log(url.parse("http://127.0.0.1:8066/#/search?q=1&id=123"))

// 事件模块
const events = require("events")
// 创建事件对象
const eventEmitter = new events.EventEmitter()
// 监听事件 once只触发一次 on一直监听
eventEmitter.once("test", () => {
  console.log("test事件触发")
})
eventEmitter.emit("test")

function fswriteJSON(data) {
  let objname = ""
  for (let key of data) {
    objname = objname + key["name"] + "\n"
  }
  // 写入数据
  fs.writeFile("haha.txt", objname, (err) => {
    if (err) {
      console.error(err);
      return
    }
    console.log("数据写入文档成功");
    // 追加数据
    fs.appendFile("haha.txt", "嘿嘿", (err) => {
      if (err) {
        console.error(err);
        return
      }
      console.log("追加数据成功");
      // 读取数据 如果不加'utf8'参数则默认获取到的是buffer数据
      fs.readFile("haha.txt", 'utf8', (err, data) => {
        if (err) {
          console.error(err);
          return
        }
        console.log("读取数据成功", data);
      })
    })
  })

  // 回调地域问题
  // 1将异步函数提出来当做参数传进去 callback 高阶函数

  // 文件流式写入
  const ws = fs.createWriteStream("./观书有感.txt")
  ws.write("远看山有色\r\n")
  ws.write("近听水无声\r\n")
  ws.write("春去花还在\r\n")
  ws.write("人来鸟不惊\r\n")

  ws.close() //关闭通道
}

let arrfsName = [
  { name: "xixi", age: 18 },
  { name: "haha", age: 18 },
  { name: "hehe", age: 18 },
]
// fswriteJSON(arrfsName)


// 文件读取
// 流式读取
// const rs = fs.createReadStream("读取文件的url")
// rs.on("data",thunk => {
//   console.log(thunk); //每次读取64kb的数据
// })
// rs.on("end")

// 文件重命名
// fs.rename("./test.html", "./newtest.html",err => {
//   if(err){
//     console.log("重命名失败");
//     return
//   }
//   console.log("重命名成功");
// })

// 批量重命名
// fs.readdir(__dirname,(err, data) => {
//   if(err){
//     console.log("读取文件夹失败");
//     return
//   }
//   let files = data //文件列表数据
//   files.forEach((file,index) =>{
//     if(file.includes("index")){
//       fs.rename(file, "index" + index + ".html", err =>{
//         console.log(index,"重命名成功");
//       })
//     }
//   })
// })

// // 文件的移动
// fs.rename("./readme.html", "./js/readme.html",err => {
//   if(err){
//     console.log("移动失败");
//     return
//   }
//   console.log("移动文件成功");
// })

// // 重命名和移动取决于第二个参数 同级目录为重命名 不同级为移动

// 删除文件
// fs.unlink("./删除.html",err => {
//   if(err){
//     console.log("删除失败");
//     return
//   }
//   console.log("删除成功");
// })
// fs.rm("./删除.html",err => {
//   if(err){
//     console.log("删除失败");
//     return
//   }
//   console.log("删除成功");
// })

// 文件夹创建
// fs.mkdir("./创建文件夹", err => {
//   if(err){
//     console.log("创建失败");
//     return
//   }
//   console.log("创建成功");
// })
// 递归创建
// fs.mkdir("./a/b/c",{recursive:true}, err =>{
//     if(err){
//     console.log("创建失败");
//     return
//   }
//   console.log("创建成功");
// })
// 查看资源状态
// fs.stat("./d3.csv", (err,data) =>{
//     if(err){
//     console.log("查看状态失败");
//     return
//   }
//   console.log("data",data);
//   console.log("data",data.isFile()); //是不是文件
//   console.log("data",data.isDirectory()); //是不是文件夹
// })




// const axios = require("axios")
// const cheerio = require("cheerio")
// async function fetchGitHubReadme(user, repo) {
//   try {
//     const url = `https://github.com/wscats/node-tutorial/tree/master/tutorial/fs`;
//     // 发送请求获取项目页面的HTML内容
//     const { data } = await axios.get(url);
//     // 使用cheerio加载页面数据
//     const $ = cheerio.load(data);
//     // 选择并提取README的HTML内容
//     const readmeHtml = $('#readme').html() || 'No README found';
//     // console.log(readmeHtml);
//     // writeFile 是异步的 不会等到结果成功
//     // setTimeout(() => {
//     //   fs.writeFile("readme.html", readmeHtml, (err) => {
//     //     if (err) {
//     //       return console.error(err);
//     //     }
//     //     console.log("html文件写入成功");
//     //   })
//     // }, 3000)
//   } catch (error) {
//     console.error('Error fetching README:', error);
//   }
// }
// 使用示例：
// fetchGitHubReadme('user', 'repo');


// buffer
// const buf = new Buffer.from("hello")
// console.log(buf[4],buf.toString());
